package com.micro.core.frame.service;

import com.micro.core.resp.RespJson;
import com.micro.core.resp.RespJsonData;
import com.micro.core.resp.RespJsonPageData;
import tk.mybatis.mapper.entity.Example;

import java.util.List;
import java.util.Map;

/**
 * @author LevelCoder
 * @version V1.0.0
 * @email LevelCoder@126.com
 * @date 2020/4/28
 */
public interface BasicsService<T,PKType> {

    /**
     * <h2>根据对象查询对象:单条数据</h2>
     * @param entity    查询对象
     * @return
     */
    RespJsonData<T> selectOne(T entity);

    /**
     * <h2>根据主键编号查询对象</h2>
     * @param id   主键编号
     * @return
     */
    RespJsonData<T> findDetail(PKType id);

    /**
     * <h2>通过Id查询,返回指定对象</h2>
     * @param id           主键编号
     * @param aClass       需要返回的对象
     * @return
     */
    RespJsonData findDetail(PKType id, Class<?> aClass);

    /**
     * <h2>根据对象查询列表 不带分页</h2>
     * @param entity   请求对象
     * @return
     */
    RespJsonData<List<T>> selectList(T entity);

    /**
     * <h2>按条件查询列表 不带分页</h2>
     * @param map     请求参数
     * @return
     */
    RespJsonData<List<T>> findListAll(Map<String, Object> map);

    /**
     * <h2>按条件查询列表 不带分页,返回指定类型列表</h2>
     * @param map         请求参数
     * @param aClass      需要返回的对象
     * @return
     */
    RespJsonData findListAll(Map<String, Object> map, Class<?> aClass);

    /**
     * <h2>查询列表 带分页</h2>
     * @param map    请求参数
     * @return
     */
    RespJsonPageData<T> findList(Map<String, Object> map);

    /**
     * <h2>查询列表 带分页,返回指定类型列表</h2>
     * @param map           请求参数
     * @param aClass        需要返回的对象
     * @return
     */
    RespJsonPageData findList(Map<String, Object> map, Class<?> aClass);

    /**
     * <h2>新增对象:直接做成选择行插入</h2>
     * @param entity
     * @return
     */
    RespJson addEntity(T entity);


    /**
     * <h2>修改对象</h2>
     * @param entity
     * @return
     */
    RespJson editEntity(T entity);

    /**
     * <h2>删除对象</h2>
     * @param entity   请求对象
     * @return
     */
    RespJson deleteEntity(T entity);

    /**
     * <h2>根据主键id删除对象</h2>
     * @param id      主键编号
     * @return
     */
    RespJson deleteById(PKType id);

    /**
     * <h2>获取 Example 组合条件对象</h2>
     * @param map     请求参数
     * @return
     */
    Example getExample(Map<String, Object> map);
}
